From 70121cba8fd66557f88b4dc685c3fcbc4d9a44aa Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 13 Apr 2010 15:38:27 +0100 Subject: [PATCH] Make c/s 21089 work again with c/s 21092 Unfortunately the latter c/s' change to mpparse.c yielded the former patch non-functional - Xen's serial port IRQ is not in IQR_DISABLED state, yet must be allowed to get its trigger mode and polarity set up in order for it to be usable. Signed-off-by: Jan Beulich --- xen/arch/x86/mpparse.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/mpparse.c b/xen/arch/x86/mpparse.c index 95aff543f2..a7007d64d0 100644 --- a/xen/arch/x86/mpparse.c +++ b/xen/arch/x86/mpparse.c @@ -1103,6 +1103,8 @@ int mp_register_gsi (u32 gsi, int triggering, int polarity) int ioapic = -1; int ioapic_pin = 0; int idx, bit = 0; + struct irq_desc * desc; + unsigned long flags; /* * Mapping between Global System Interrups, which @@ -1127,8 +1129,13 @@ int mp_register_gsi (u32 gsi, int triggering, int polarity) if (ioapic_renumber_irq) gsi = ioapic_renumber_irq(ioapic, gsi); - if (!(irq_to_desc(gsi)->status & IRQ_DISABLED)) + desc = irq_to_desc(gsi); + spin_lock_irqsave(&desc->lock, flags); + if (!(desc->status & IRQ_DISABLED) && desc->handler != &no_irq_type) { + spin_unlock_irqrestore(&desc->lock, flags); return -EEXIST; + } + spin_unlock_irqrestore(&desc->lock, flags); /* * Avoid pin reprogramming. PRTs typically include entries -- 2.30.2